let KoaRouter = require('koa-router');
var Fly=require("flyio/src/node")
var fly=new Fly;

let jwt = require('jsonwebtoken'); //jsonwebtoken  简称JWT
// 这个包里面就两个api我们有用
// 一个是用来去签名的（加密）
// 另外一个就是用来验签（通过签名信息来判定是不是自己的token）

// 3. 生成路由器对象
const router = new KoaRouter();


// 5. 注册路由
// express: request, response, next
// koa: ctx, next


// (req,res) => {
// 	res.send()
// } express

// (ctx) => {
// 	ctx.body = 
// } koa


// 5.1 首页数据及详情接口
let goodsDetailData = require('../datas/goodsDetail.json');
console.log(typeof goodsDetailData); 

router.get('/getGoodsDetail', (ctx) => {
	// 没有使用数据库，数据处理会简单 
	// 使用了数据库，仅仅是函数内部处理数据的流程麻烦了点
  console.log(goodsDetailData);
	ctx.body = goodsDetailData;
});



// 5.2 中国茶仓接口
let teaHouseData = require('../datas/teaHouse.json');
// console.log(typeof indexData);
router.get('/getTeaHouse', (ctx) => {
	ctx.body = teaHouseData;
});


// 5.3 T豆购接口
let eventDatas = require('../datas/event.json');
// console.log(typeof indexData);

router.get('/getEvent', (ctx) => {
	ctx.body = eventDatas;
});



// 写一个路由用来接收前台小程序发送过来的code凭证
router.get('/getOpenid', async (ctx) => {
	// ctx其实是一个上下文 全称叫context
	// 这个后台我们使用的是koa框架写的，它是express的阉割版，轻量级的express
	// 在express当中，回调函数是有两个参数一个叫req  一个叫res 
	// req是代表请求参数工具
	// res是代表响应参数工具
	// 它之前在返回数据的时候 需要调用res.send(json)返回数据给前台
	
	// koa它是把res和req合并成一个了 叫ctx
	// koa当中如果要返回数据需要调用ctx.body = json
	// console.log(ctx.query);
	let code = ctx.query.code   //保存前台传递过来的用户的登录凭证code
	// 3、后台拿到凭证以后，和商户的appid及秘钥，三个条件缺一不可，发送给微信的服务器
	let appId = 'wx96c71d20c0194b21'
	let secret = '63902de023ced80deae844b8a4b52d1b'
	// 发送的微信后台服务接口
	let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code `
	
	const result = await fly.get(url)
	// console.log(result);
	let openid = JSON.parse(result.data).openid
	// console.log(openid);
	
	// 一般我们不会把这么隐私而且重要的东西，直接明文传递在网络当中
	// 我们都会把这些东西做成加密的，说白了就是现在我们所在前台看到的token
	// "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.     头信息
	// H4sIAAAAAAAAAKtWKi5NUrJSSkzJzcxT0lFKrShQsjI0Mzc2NjYzMTStBQCIqdBTIAAAAA.  负载信息
	// IUJuBQFPyYHmr37yS6qgAnyhaPoX0fbV5bMYeGfH2FZOmtSsNTL4-DH708NYyE0DVZPXQHX1NE65rHEKzeXUhA"   加密算法
	
	// 加密算法其实是好几种加密算法综合在一起的，最厉害的属于sha    sha1  sha128  sha256
	// token是不需要再后台保存的，它是最终生成后给前端，前端去保存在自己本地的localstorage当中的
	// 因此token不浪费资源
	// 后台只需要知道一个算法即可，前台发送token过来之后，通过算法去验签即可
	
	// 制作token都是后台干的
	// 一般我们都是拿用户的一些信息通过固定的包或者api 去把用户的信息进行加密产生token
	// 通常情况下vue如果不牵扯微信服务器，就是我们自己写的后台，我们都是拿用户的数据表当中id  userId作为负载去加密
	
	
	// 把openid制作成jwt
	const tokenData = jwt.sign({
	  data: openid
	}, 'zhaoliying', { expiresIn: '7day' });
	
	// console.log(tokenData);
	ctx.body = tokenData
});


// 后期这个逻辑需要token才能操作
router.get('/aaa',ctx => {
	let token = ctx.query.token
	// 所有需要token才能操作的接口当中都要去验证token是不是对的
	// 也就是说我们需要验签才能继续操作
	let result = verifyToken(token)
	if(result !== 'haha'){
		let openid = result
		// 通过openid获取用户隐私信息
		let userInfo = 'aaaaa'
		ctx.body = userInfo
	}else{
		ctx.body = 'token过期，请重新登录获取token'
	}
})


// 验签函数
// 这个验签函数后期在后台当中，只要是用到的token都要调用这个验签函数
function verifyToken(token){
	var decoded = jwt.verify(token, 'zhaoliying');
	// console.log(decoded);
	// {
	//   data: 'oAMuP5ZTx9TIe79wk4rwtpMshbJ0',
	//   iat: 1673334161,
	//   exp: 1673938961
	// }
	if(decoded.exp > decoded.iat){
		// token是没过期而且是对的
		return decoded.data
	}else{
		return 'haha'
	}
}



module.exports = router;
